/**
 * @作者 钟先崟
 * @时间 2023-02-04 17:28
 * @功能 42. 接雨水
 * 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图，计算按此排列的柱子，下雨之后能接多少雨水。
 * 示例 1：
 * 输入：height = [0,1,0,2,1,0,1,3,2,1,2,1]
 * 输出：6
 * 解释：上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图，在这种情况下，可以接 6 个单位的雨水（蓝色部分表示雨水）。
 */
class Solution
{
    public static void main(String[] args)
    {
//        int[] height = new int[]{0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1};
        int[] height = new int[]{4, 2, 0, 3, 2, 5};
        System.out.println(trap(height));
    }

    public static int trap(int[] height)
    {
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        int num = 0;
        for (int i = 0; i < height.length; i++)
        {
            if (max < height[i])
                max = height[i];
            if (height[i] != 0 && min > height[i])
                min = height[i];
            if (height[i] == 0 && i != 0 && i != height.length - 1)
                num++;
        }
        int area = 0;
        if (max > 1000)
        {
            area = num * min;
        } else min = 0;
        for (int i = min; i <= max - 1; i++)
        {
            int black = 0;
            int water = 0;
            int waterNum = 0;
            for (int j = 0; j < height.length; j++)
            {
                //遇到的第一个水左边的方块
                if (water == 0 && height[j] - i >= 1)
                {
                    black = 1;
                } else if (black == 1 && height[j] - i <= 0)
                {
                    water = 1;
                    waterNum++;
                } else if (water == 1 && height[j] - i >= 1)
                {
                    black = 1;
                    water = 0;
                    area = area + waterNum;
                    waterNum = 0;
                }
            }
        }
        return area;
    }
}